home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / ike_detect.nasl < prev    next >
Text File  |  2005-01-14  |  14KB  |  336 lines

  1. #
  2. # (C) Tenable Network Security
  3. #
  4. # script audited and subsequently patched thanks to submission by Bert Salaets
  5.  
  6. if(description) {
  7.  script_id(11935);
  8.  script_version("$Revision: 1.5 $");
  9.  
  10.  name["english"] = "IPSEC IKE detection";
  11.  script_name(english:name["english"]);
  12.  
  13.  desc["english"] =  
  14. "The remote host seems to be enabled to do Internet Key
  15. Exchange (IKE).  This is typically indicative of a VPN server.
  16. VPN servers are used to connect remote hosts into internal
  17. resources.  
  18.  
  19. Solution: You should ensure that:
  20. 1) The VPN is authorized for your Companies computing environment
  21. 2) The VPN utilizes strong encryption
  22. 3) The VPN utilizes strong authentication
  23.  
  24. Risk factor : Low";
  25.  
  26.  script_description(english:desc["english"]);
  27.  
  28.  summary["english"] = "IPSEC IKE detect";
  29.  script_summary(english:summary["english"]);
  30.  
  31.  script_category(ACT_GATHER_INFO);
  32.  
  33.  script_copyright(english:"This script is Copyright (C) 2003 Tenable Network Security");
  34.  family["english"] = "General";
  35.  script_family(english:family["english"]);
  36.  exit(0);
  37. }
  38.  
  39. #
  40. # The script code starts here
  41. #
  42.  
  43.  
  44. function calc_data() {
  45.     T_PAY1 = T_NP + T_RES + T_PLEN + T_NUM + T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 + T_AC2 + T_AV2 + T_FLAGS3
  46. + T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 +  T_AC6 + T_ALEN + T_AV6;
  47.  
  48.    for (MU=2; MU < TRANSFORM_MAX; MU++) {
  49.  
  50.     TPAY[MU] = T_NP + T_RES + T_PLEN + raw_string(MU) + T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 + T_AC2 + T_AV2 + T_FLAGS3 + T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 + T_AC6 + T_ALEN + T_AV6;
  51.  
  52. }
  53.  
  54. TPAY[MU] = raw_string(0x00) + T_RES + T_PLEN + raw_string(MU) +  T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 + T_AC2 + T_AV2 + T_FLAGS3 + T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 + T_AC6 + T_ALEN + T_AV6;
  55.  
  56.  
  57.     tmp =  (MU * T_PAY_SZ) + strlen(IC) + strlen(RC) + strlen(NP) + strlen(MV) + strlen(ET) + strlen(IF) + strlen(MI) + 4;
  58.     
  59.     tmp = tmp + SA_HEADER_SZ + PROP_HEADER_SZ;               # sizeof SA_HEADER + PROP_HEADER
  60.     myplen = tmp - 28;
  61.     myp_plen = myplen - 12;
  62.  
  63.     len4 = tmp / 0xFFFFFF;
  64.     len3 = tmp / 0xFFFF;
  65.     len2 = tmp / 0xFF;
  66.     len1 = tmp % 256;
  67.     LEN=raw_string(len4,len3,len2,len1);
  68.  
  69.     len2 = myplen / 0xFF;
  70.     len1 = myplen % 256;
  71.     PLEN=raw_string(len2, len1);
  72.  
  73.     len2 = myp_plen / 0xFF;
  74.     len1 = myp_plen % 256;
  75.     P_PLEN=raw_string(len2, len1);   
  76.  
  77.     SA_HEADER = SA_NP + RES + PLEN + DOI + SIT;
  78.  
  79.     PROP_HEADER = P_NP + P_RES + P_PLEN + P_NUM + PID + SPI_SZ + T_NUM_TOT;
  80.  
  81.     ISAKMP_HEADER = IC + RC + NP + MV + ET + IF + MI + LEN;
  82.  
  83.     blap = ISAKMP_HEADER + SA_HEADER + PROP_HEADER + T_PAY1;
  84.     for (MU=2; MU <= TRANSFORM_MAX; MU++) {    
  85.         blap = blap + TPAY[MU];
  86.     }
  87.  
  88.     return(blap);
  89. }
  90.  
  91.  
  92.  
  93.  
  94.  
  95. srcaddr = this_host();
  96. dstaddr = get_host_ip();
  97. port = 500;
  98. srcport = rand() % 65535;
  99.  
  100. if(!get_udp_port_state(port))exit(0);
  101.  
  102.  
  103.  
  104. #------ISAKMP header-----#
  105.  
  106. IC = raw_string (0xFF, 0x00, 0xFE, 0x01, 0xFD, 0x02, 0xFC, 0x03);    #8 byte Initiator cookie
  107. RC = raw_string (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);    #8 byte Responder cookie
  108.  
  109. NP = raw_string (0x01);                                              #Next payload = 1 = Security Association
  110.                                                                      # 2 = proposal / 3 = transform /  4 = Key exchange
  111.                                                                      # 5 = ID /  6 = CERT / 7 = Cert request
  112.                                                                      # 8 = HASH / 9 = SIGNATURE / 10 = NONCE
  113.                                                                      # 11 = Notification / 12 = Delete
  114.                                                                      # 13 = Vendor ID / 14-27 = RESERVED
  115.                                                                      # 128-255 = PRIVATE USE
  116.  
  117.  
  118. MV = raw_string (0x10);                                              # 4bits = Major version
  119.                                                                      # 4 low order bits = Minor version
  120.  
  121.  
  122. ET = raw_string (0x02);                                              # Exchange type = 4 = AGGRESSIVE
  123.                                                                      # 0 = NONE / 1 = BASE / 2 = Identity protection
  124.                                                                      # 3 = Authentication only  / 5 = Informational
  125.                                                                      # 6-31 = FUTURE USE / 32-239 = DOI use
  126.                                                                      # 240-255 = Private use
  127.  
  128. IF = raw_string (0x00);
  129. MI = raw_string(0x00,0x00,0x00,0x00);                                # Message ID
  130. #LEN = raw_string (0x00,0x00,0x01,0x7b);                              # Length = total length of UDP data field
  131.  
  132.  
  133. #ISAKMP_HEADER = IC + RC + NP + MV + ET + IF + MI + LEN;
  134. ISAKMP_HEADER_SZ = 28;
  135.  
  136.  
  137.  
  138.  
  139.  
  140. # ----- Security Association ---------#
  141.  
  142. SA_NP = raw_string(0x00);                                            # Security Association next payload = key exchange
  143. RES = raw_string(0x00);                                              # reserved
  144. PLEN = raw_string(0x00,0x80);                                        # Security association payload length = LEN - 28
  145.                                                                      # total len of all payloads (through last TP) + 12
  146. DOI = raw_string(0x00,0x00,0x00,0x01);                               # DOI = generic ISAKMP Security Association
  147. SIT = raw_string(0x00,0x00,0x00,0x01);                               # Situation
  148.  
  149. SA_HEADER = SA_NP + RES + PLEN + DOI + SIT;
  150. SA_HEADER_SZ = 12;
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157. # ------Proposal --------------------#
  158.  
  159. P_NP = raw_string(0x00);                                             # Proposal next payload = 0 (last proposal payload)
  160. P_RES = raw_string(0x00);                                            # reserved
  161. P_PLEN = raw_string(0x00,0x74);                                      # Proposal payload length = LEN - 40 
  162.                                                                      # payloads through last TP
  163. P_NUM = raw_string(0x01);                                            # proposal number
  164. PID = raw_string(0x01);                                              # protocol ID = 1 = proto_isakmp
  165. SPI_SZ = raw_string(0x00);                                           # SPI size
  166. T_NUM_TOT = raw_string(0x08);                                            # number of transforms
  167.  
  168. PROP_HEADER = P_NP + P_RES + P_PLEN + P_NUM + PID + SPI_SZ + T_NUM_TOT;
  169. PROP_HEADER_SZ = 8;
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176. # -----Transform Payload ------------#
  177. T_NP = raw_string(0x03);                                             # transform next payload = 3 = more transforms
  178. T_RES = raw_string(0x00);                                            # reserved
  179. T_PLEN = raw_string(0x00,0x24);                                      # payload length --  36 bytes per transform
  180. T_NUM = raw_string(0x01);                                            # transform number
  181. T_ID = raw_string(0x01);                                             # transform ID
  182. T_RES2 = raw_string(0x00,0x00);                                      # reserved
  183. T_FLAGS = raw_string(0x80);                                          # data attribute following TV format
  184. T_AC = raw_string(0x01);                                             # Attribute type/class = 1 encryption alg basic
  185. T_AV = raw_string(0x00,0x05);                                        # Transform attribute value = 3des_CBC
  186. T_FLAGS2 = raw_string(0x80);
  187. T_AC2 = raw_string(0x02);                                            # attribute type/class = 2 = hash alg basic
  188. T_AV2 = raw_string(0x00,0x02);                                       # attribute value = 2 = SHA
  189. T_FLAGS3 = raw_string(0x80);
  190. T_AC3 = raw_string(0x03);                                            # attribute type/class = 4 = group description basic
  191. T_AV3 = raw_string(0x00,0x01);                                       # attribute value = 2 = alternate 1024 bit MODP group
  192. T_FLAGS4 = raw_string(0x80);
  193. T_AC4 = raw_string(0x04);                                            # attribute type/class = 3 = basic authentication
  194. T_AV4 = raw_string(0x00,0x02);                                       # attribute value = 65001 = for private use
  195. T_FLAGS5 = raw_string(0x80);
  196. T_AC5 = raw_string(0x0b);                                            # attribute type/class = 11 = basic life type
  197. T_AV5 = raw_string(0x00,0x01);                                       # attribute value = 1 = life duration in seconds
  198. T_FLAGS6 = raw_string(0x00);
  199. T_AC6 = raw_string(0x0c);                                            # attribute type/class = 12 = variable life duration
  200. T_ALEN = raw_string(0x00,0x04);                                      # attribute length = 4 bytes
  201. T_AV6 = raw_string(0x00,0x20,0xC4,0x9B);                             # attribute value
  202.  
  203. T_PAY_SZ = 36;
  204.  
  205. T_PAY1 = T_NP + T_RES + T_PLEN + T_NUM + T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 + T_AC2 + T_AV2 + T_FLAGS3 +
  206. T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 + T_AC6 + T_ALEN + T_AV6;
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214. # -----Transform Payloads 2 and up -----------#
  215. # nothing changes except transform number .... and "Next payload" (on last payload)
  216.  
  217. TRANSFORM_MAX = 8;
  218.  
  219. for (TPAYRRAY=2; TPAYRRAY < TRANSFORM_MAX; TPAYRRAY++) {
  220.  
  221.     TPAY[TPAYRRAY] = T_NP + T_RES + T_PLEN + raw_string(TPAYRRAY) + T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 + T_AC2 + T_AV2 + T_FLAGS3 + T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 + T_AC6 + T_ALEN + T_AV6; 
  222. }
  223.  
  224. TPAY[TPAYRRAY] = raw_string(0x00) + T_RES + T_PLEN + raw_string(TPAYRRAY) +  T_ID + T_RES2 + T_FLAGS + T_AC + T_AV + T_FLAGS2 + T_AC2 + T_AV2 + T_FLAGS3 + T_AC3 + T_AV3 + T_FLAGS4 + T_AC4 + T_AV4 + T_FLAGS5 + T_AC5 + T_AV5 + T_FLAGS6 + T_AC6 + T_ALEN + T_AV6;
  225.  
  226.  
  227.  
  228.  
  229.  
  230. #--------end Proposal Payload ------------------------#
  231.  
  232. #--------end Security Association Payload-------------#
  233.  
  234.  
  235.  
  236.  
  237.  
  238. # added this blurb in order to handle racoon which doesn't like
  239. # Exchange type set to BASIC
  240. # --------------------------------------------
  241.  
  242. blat = calc_data();
  243. soc = open_sock_udp(port);
  244. if (!soc) exit(0);
  245. send (socket:soc, data:blat);
  246. r = recv(socket:soc, length:48, timeout:2);
  247. rlen = strlen(r);
  248.  
  249. if (rlen > 16) {
  250.        if (  (ord(r[16]) == 0x01) && (ord(r[18]) == 0x02)  ) { security_warning(port, protocol:"udp"); exit(0); }
  251.        if (  (ord(r[16]) == 0x0B) && (ord(r[18]) == 0x05)  ) { security_warning(port, protocol:"udp"); exit(0); }
  252.        # still here?
  253.        mywarning = string("The remote host answers on port 500 UDP\n");
  254.        mywarning += string("If you know what the host is running, please send the\n");
  255.        # maybe need an address like ike-fingerprint@nessus.org????
  256.        mywarning += string("version as well as the following text to jwlampe@nessus.org : \n\n");
  257.        for (i=0; i<rlen; i++) {
  258.            mywarning = mywarning + (string(ord(r[i]), " "));
  259.        }
  260.         security_warning(port, protocol:"udp"); 
  261.        exit(0);
  262. }
  263.  
  264. # end racoon check ---------------------------
  265.  
  266.  
  267.  
  268. # now handle non-racoon IPSEC ;-)
  269. ET = raw_string(0x01);                 # change exchange type to BASIC
  270. MV = raw_string(0xFF);                 # set Major version = minor version = 15 (obviously bogus)
  271.                                        # this *should* generate an error reply
  272.  
  273.  
  274. blat = calc_data();
  275.  
  276.  
  277. soc = open_sock_udp(port);
  278. if (!soc) exit(0);
  279. send (socket:soc, data:blat);
  280. r = recv(socket:soc, length:48, timeout:2);
  281. rlen = strlen(r);
  282. if (rlen > 16) {
  283.     if (  (ord(r[16]) == 0x0B) && (ord(r[18]) == 0x05)  )  security_warning(port, protocol:"udp"); 
  284. } else {
  285.     #nudge packet didn't work...We'll have to do a little more...
  286.     # why this check, you might ask????
  287.     # well, some implementations of IPSEC (Microsoft,...) will receive a packet from src port != 500 and dst port=500
  288.     # and reply from src port == 500 dst port == 500
  289.  
  290.     
  291.     blat = calc_data();
  292.     oneoff = strlen(blat);
  293.     filter = string("udp and src host ", get_host_ip(), " and dst host ", this_host(), " and dst port ", port);
  294.     ip = forge_ip_packet(                ip_v : 4,
  295.                                          ip_hl : 5,
  296.                                          ip_tos : 0,
  297.                                          ip_len : 20,
  298.                                          ip_id : 0xABBA,
  299.                                          ip_p : IPPROTO_UDP,
  300.                                          ip_ttl : 255,
  301.                                          ip_off : 0,
  302.                                          ip_src : this_host(),
  303.                                          ip_dst : get_host_ip());
  304.  
  305.  
  306.     udpip = forge_udp_packet(                    ip : ip,
  307.                                                  uh_sport : srcport,
  308.                                                  uh_dport : 500,
  309.                                                  uh_ulen : oneoff + 8,
  310.                                                  data : blat);
  311.  
  312.     live = send_packet(udpip, pcap_active:TRUE, pcap_filter:filter);
  313.     myrep = string("The remote host seems to be enabled to do Internet Key
  314. Exchange.  This is typically indicative of a VPN server.
  315. VPN servers are used to connect remote hosts into internal
  316. resources.  In addition, The remote host seems to be configured 
  317. to force all communications across port 500 for both the source and
  318. destination port.  That is, we sent the machine a packet from a random 
  319. port greater than 1024.  The machine sent the reply back to port 500. 
  320.  
  321. NOTE: This sort of behavior has been observed on Microsoft machines.
  322.  
  323. Solution: You should ensure that:
  324. 1) The VPN is authorized for your Companies computing environment
  325. 2) The VPN utilizes strong encryption
  326. 3) The VPN utilizes strong authentication
  327.  
  328. Risk factor : Low");
  329.     if (live) {
  330.         if (  (ord(live[44]) == 0x0B) && (ord(live[46]) == 0x05)  ) security_warning(port:port, data:myrep, proto:"udp");
  331.     }
  332. }
  333.  
  334. exit(0);
  335.  
  336.